package chapter4.homework;

/**
 * @Project ：learn_java
 * @File ：AtomicQ6ButNotWork.java
 * @IDE ：IntelliJ IDEA
 * @Author ：自由如风间
 * @Date ：2025/3/10 21:18
 * @Description ：ds给我的代码,罕见的居然出错了.
 */

import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicInteger;

class Tunnel02 implements Runnable {
    private static final Semaphore tunnelSemaphore = new Semaphore(1); // 山洞容量为1
    private static final AtomicInteger crossNum = new AtomicInteger(0);
    private final String personName;

    public Tunnel02(String name) {
        this.personName = name;
    }

    @Override
    public void run() {
        try {
            // 1. 申请进入隧道
            tunnelSemaphore.acquire();

            // 2. 开始通过
            System.out.println(personName + "开始通过隧道...");
            Thread.sleep(5000); // 模拟耗时5秒

            // 3. 记录通过顺序
            int sequence = crossNum.incrementAndGet();
            System.out.println(personName + "已经通过隧道，TA是第" + sequence + "通过的！");

        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            // 4. 释放隧道资源
            tunnelSemaphore.release();
        }
    }
}

public class AtomicQ6ButNotWorking {
    public static void main(String[] args) {
        // 创建10个人（线程）
        for (int i = 1; i <= 10; i++) {
            // WARNING 问题出在这里,
            // 在 main 方法中，每次循环都创建了一个新的 Tunnel 对象（new Tunnel("person" + i)）。
            // 虽然 tunnelSemaphore 是静态的，控制了并发，但每个线程运行的是不同的 Tunnel 实例。
            // 每个线程独立运行，没有共享状态，导致输出顺序和预期不符。
            // 正确做法应该是让所有代码都共享同一个tunnel对象,而不是每次都单独创建一个
            new Thread(new Tunnel02("person" + i)).start();
        }
    }
}
